package com.company.pedidos.web.controller;

import java.util.List;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.SessionAttributes;

import com.company.canonical.beans.JsonJTableDetallePrecioBean;
import com.company.canonical.beans.JsonJTablePrecioBean;
import com.company.canonical.beans.JsonJTableProductoBean;
import com.company.pedidos.service.PedidosService;
import com.company.pedidos.web.command.PrecioCommand;
import com.company.pedidos.web.command.ProductoCommand;
import com.company.pedidos.web.datatable.response.JtableJsonListResponse;

@SessionAttributes({ "precioIdParam" })
@Controller
public class ProductoController {
	private static final Logger logger = Logger
			.getLogger(ProductoController.class);

	@Autowired
	private PedidosService pedidosService;

	@ModelAttribute(value = "producto")
	public ProductoCommand obtenerProductoModel() {
		logger.debug("creating @ModelAttribute object");
		ProductoCommand productoCommand = new ProductoCommand();
		return productoCommand;
	}
	
	
	@ModelAttribute(value = "precio")
	public PrecioCommand obtenerPrecioModel() {
		logger.debug("creating @ModelAttribute object");
		PrecioCommand precioCommand = new PrecioCommand();
		return precioCommand;
	}

	/**
	 * 
	 * @return
	 */
	@RequestMapping(value = "/producto/mostrar", method = RequestMethod.GET)
	public String inicioConsultaProducto(ModelMap modelMap) {
		return "producto/listaProducto";
	}

	/**
	 * 
	 * @return
	 */
	@RequestMapping(value = "/precio/mostrar", method = RequestMethod.GET)
	public String inicioConsultaPrecio(ModelMap modelMap) {
		return "producto/listaPrecio";
	}

	/**
	 * @return
	 */
	@RequestMapping(value = "/producto/buscar", method = RequestMethod.POST)
	@ResponseBody
	public JtableJsonListResponse<JsonJTableProductoBean> buscarProducto(
			@ModelAttribute(value = "producto") ProductoCommand producto,
			@RequestParam(required = false, value = "jtStartIndex") int jtStartIndex,
			@RequestParam(required = false, value = "jtPageSize") int jtPageSize) {
		JtableJsonListResponse<JsonJTableProductoBean> jsonString;
		List<JsonJTableProductoBean> listaProducto;
		try {
			Long expenseCount = pedidosService.buscarProductoCount(
					producto.getCodigoProducto(),
					producto.getCategoriaProducto());
			
			System.out.println("["+producto.getCodigoProducto()+"]");
			System.out.println("["+producto.getCategoriaProducto()+"]");
			System.out.println(":: TOtal rows :: "+ expenseCount);
			listaProducto = pedidosService.buscarProducto(
					producto.getCodigoProducto(),
					producto.getCategoriaProducto(), jtStartIndex, jtPageSize);
			System.out.println(":: TOtal rows :: jtStartIndex="+ jtStartIndex+" jtPageSize="+jtPageSize);
			jsonString = new JtableJsonListResponse<JsonJTableProductoBean>(
					"OK", listaProducto, expenseCount.intValue());
		} catch (Exception e) {
			jsonString = new JtableJsonListResponse<JsonJTableProductoBean>(
					"ERROR", e.getMessage());
		}
		return jsonString;
	}

	/**
	 * @return
	 */
	@RequestMapping(value = "/precio/buscar", method = RequestMethod.POST)
	@ResponseBody
	public JtableJsonListResponse<JsonJTablePrecioBean> buscarPrecio(
			@ModelAttribute(value = "precio") PrecioCommand precio,
			@RequestParam("jtStartIndex") int jtStartIndex,
			@RequestParam("jtPageSize") int jtPageSize) {
		JtableJsonListResponse<JsonJTablePrecioBean> jsonString;
		List<JsonJTablePrecioBean> listaPrecio;
		try {
			logger.debug("fecha: "+ precio.getFechaVigencia());
			Long expenseCount = pedidosService.buscarPrecioCount(precio.getCodigoListaPrecio(),
					 precio.getFechaVigencia());
			
			listaPrecio = pedidosService.buscarPrecio(precio.getCodigoListaPrecio(),
					precio.getFechaVigencia(), jtStartIndex, jtPageSize);
			jsonString = new JtableJsonListResponse<JsonJTablePrecioBean>("OK",
					listaPrecio, expenseCount.intValue());
		} catch (Exception e) {
			jsonString = new JtableJsonListResponse<JsonJTablePrecioBean>(
					"ERROR", e.getMessage());
		}
		return jsonString;
	}

	/**
	 * @return
	 */
	@RequestMapping(value = "/precio/detalle/mostrar")
	public String mostrarDetallePrecio(ModelMap modelMap, @RequestParam int precioId) {
		logger.debug("Mostrar Detalle Precio + " + precioId);
		modelMap.addAttribute("precioIdParam", precioId);
		return "producto/listaDetallePrecio";
	}

	/**
	 * @return
	 */
	@RequestMapping(value = "/precio/detalle/consulta", method = RequestMethod.POST)
	@ResponseBody
	public JtableJsonListResponse<JsonJTableDetallePrecioBean> mostrarDetallePrecio(
			ModelMap modelMap) {
		JtableJsonListResponse<JsonJTableDetallePrecioBean> jsonString;
		List<JsonJTableDetallePrecioBean> listaDetallePrecio;

		try {
			int precioId = (Integer) modelMap.get("precioIdParam");
			listaDetallePrecio = pedidosService.listaDetallePrecio(precioId);
			jsonString = new JtableJsonListResponse<JsonJTableDetallePrecioBean>(
					"OK", listaDetallePrecio, listaDetallePrecio.size());
		} catch (Exception e) {
			jsonString = new JtableJsonListResponse<JsonJTableDetallePrecioBean>(
					"ERROR", e.getMessage());
		}
		return jsonString;
	}
}
